<?php
/**
	--------------------------------------------------
	环信PHP REST示例代码
	--------------------------------------------------
	Copyright(c) 2015 环信即时通信云 www.easemob.com
	--------------------------------------------------
	Author: 神之爱 <fengpei@easemob.com>
	--------------------------------------------------
*/
//define('KC_FFMPEG_PATH', 'ffmpeg -i "%s" 2>&1');

class Easemob{
	private $client_id;
	private $client_secret;
	private $org_name;
	private $app_name;
	private $url;
	private $filepath; //token文件、log文件存放路径
	//------------------------------------------------------用户体系
	/**
	 * 初始化参数
	 *
	 * @param array $options
	 * @param $options['client_id']
	 * @param $options['client_secret']
	 * @param $options['org_name']
	 * @param $options['app_name']
	 */
	public function __construct($options) {
		$this->client_id = isset ( $options ['client_id'] ) ? $options ['client_id'] : '';
		$this->client_secret = isset ( $options ['client_secret'] ) ? $options ['client_secret'] : '';
		$this->org_name = isset ( $options ['org_name'] ) ? $options ['org_name'] : '';
		$this->app_name = isset ( $options ['app_name'] ) ? $options ['app_name'] : '';
		if (! empty ( $this->org_name ) && ! empty ( $this->app_name )) {
			$this->url = 'https://a1.easemob.com/' . $this->org_name . '/' . $this->app_name . '/';
		}
		$this->filepath = '';
		if (defined('ROOT_PATH')) {
			$this->filepath = ROOT_PATH . "/temp/";
			//echo $this->filepath;
			if (!is_dir($this->filepath)) {
				$this->makeDir($this->filepath);
			}
		}
	}
	/*
		获取token
	*/
	function getToken(){
		$filename = "easemob_token.json";
		if(!file_exists($this->filepath.$filename)){
			$tokenResult=$this->getTokenAction($filename);
		}else{
			$content = $this->getFile($filename);
			$tokenResult = json_decode($content, true);
			if (!is_array($tokenResult) || !isset($tokenResult['access_token']) || time()>intval($tokenResult['expires_in'])) {
				$tokenResult=$this->getTokenAction($filename);
			}
		}
		return "Authorization:Bearer ".$tokenResult['access_token'];
	}
	function getTokenAction($filename){
		$options=array(
			"grant_type"=>"client_credentials",
			"client_id"=>$this->client_id,
			"client_secret"=>$this->client_secret
		);
		//json_encode()函数，可将PHP数组或对象转成json字符串，使用json_decode()函数，可以将json字符串转换为PHP数组或对象
		$body=json_encode($options);
		//使用 $GLOBALS 替代 global
		$url=$this->url.'token';
		//$url=$base_url.'token';
		$tokenResult = $this->postCurl($url,$body,$header=array());
		//var_dump($tokenResult['expires_in']);
		//return $tokenResult;
		$tokenResult['expires_in'] = intval($tokenResult['expires_in'])+time();
		$this->saveFile($filename, json_encode($tokenResult));
		return $tokenResult;
	}
	/*
		授权注册
	*/
	function createUser($username,$password,$nickname=''){
		$url=$this->url.'users';
		$options=array(
			"username"=>$username,
			"password"=>$password
		);
		if(!empty($nickname))$options["nickname"]=$nickname;
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		批量注册用户
	*/
	function createUsers($options){
		$url=$this->url.'users';
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		重置用户密码
	*/
	function resetPassword($username,$newpassword){
		$url=$this->url.'users/'.$username.'/password';
		$options=array(
			"newpassword"=>$newpassword
		);
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,"PUT");
		return $result;
	}
	/*
		获取单个用户
	*/
	function getUser($username){
		$url=$this->url.'users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,"GET");
		return $result;
	}
	/*
		获取批量用户
	*/
	function getUsers($limit=0,$cursor=''){
		$limit=$limit?"&limit=".$limit:'';
		$cursor=!empty($cursor)?"&cursor=".$cursor:'';
		$url=$this->url."users?type=getusers".$limit.$cursor;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,"GET");
		if(isset($result["cursor"])){
			$this->saveFile("user_cursor.txt",$result["cursor"]);
		}
		return $result;
	}
	/*
		删除单个用户
	*/
	function deleteUser($username){
		$url=$this->url.'users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		删除批量用户
		limit:建议在100-500之间，、
		注：具体删除哪些并没有指定, 可以在返回值中查看。
	*/
	function deleteUsers($limit){
		$url=$this->url.'users?limit='.$limit;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		修改用户昵称
	*/
	function editNickname($username,$nickname){
		$url=$this->url.'users/'.$username;
		$options=array(
			"nickname"=>$nickname
		);
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,'PUT');
		return $result;
	}
	/*
		添加好友
	*/
	function addFriend($username,$friend_name){
		$url=$this->url.'users/'.$username.'/contacts/users/'.$friend_name;
		$header=array($this->getToken(),'Content-Type:application/json');
		$result=$this->postCurl($url,'',$header,'POST');
		return $result;
	}
	/*
		删除好友
	*/
	function deleteFriend($username,$friend_name){
		$url=$this->url.'users/'.$username.'/contacts/users/'.$friend_name;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		查看好友
	*/
	function showFriends($username){
		$url=$this->url.'users/'.$username.'/contacts/users';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		查看用户黑名单
	*/
	function getBlacklist($username){
		$url=$this->url.'users/'.$username.'/blocks/users';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		往黑名单中加人
	*/
	function addUserForBlacklist($username,$usernames){
		$url=$this->url.'users/'.$username.'/blocks/users';
		$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,'POST');
		return $result;
	}
	/*
		从黑名单中减人
	*/
	function deleteUserFromBlacklist($username,$blocked_name){
		$url=$this->url.'users/'.$username.'/blocks/users/'.$blocked_name;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	 /*
		查看用户是否在线
	 */
	function isOnline($username){
		$url=$this->url.'users/'.$username.'/status';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		查看用户离线消息数
	*/
	function getOfflineMessages($username){
		$url=$this->url.'users/'.$username.'/offline_msg_count';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		查看某条消息的离线状态
		----deliverd 表示此用户的该条离线消息已经收到
	*/
	function getOfflineMessageStatus($username,$msg_id){
		$url=$this->url.'users/'.$username.'/offline_msg_status/'.$msg_id;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		禁用用户账号
	*/
	function deactiveUser($username){
		$url=$this->url.'users/'.$username.'/deactivate';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header);
		return $result;
	}
	/*
		解禁用户账号
	*/
	function activeUser($username){
		$url=$this->url.'users/'.$username.'/activate';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header);
		return $result;
	}
	/*
		强制用户下线
	*/
	function disconnectUser($username){
		$url=$this->url.'users/'.$username.'/disconnect';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	//--------------------------------------------------------上传下载
	/*
		上传图片或文件
	*/
	function uploadFile($filepath,$access=true){
		$url=$this->url.'chatfiles';
		$file=$this->getFile($filepath,false);
		$body['file']=$file;
		$header=array('enctype:multipart/form-data',$this->getToken());
		if($access)array_push($header,"restrict-access:true");
		$result=$this->postCurl($url,$body,$header,'XXX');
		return $result;
	}
	/*
		下载文件或图片
	*/
	function downloadFile($uuid,$secret=''){
		$url=$this->url.'chatfiles/'.$uuid;
		$header = array("Accept:application/octet-stream",$this->getToken());
		if($secret)array_push($header,"share-secret:".$secret);
		$result=$this->postCurl($url,'',$header,'GET');
		$filename = md5(time().mt_rand(10, 99)).".png"; //新图片名称
		$this->makeDir("./resource/down/");
		$file = fopen("./resource/down/".$filename,"w") or die("Unable to open file!");//打开文件准备写入
		fwrite($file,$result);//写入
		fclose($file);//关闭
		return $filename;
	}
	/*
		下载图片缩略图
	*/
	function downloadThumbnail($uuid,$secret=''){
		$url=$this->url.'chatfiles/'.$uuid;
		$header = array("Accept:application/octet-stream",$this->getToken(),"thumbnail:true");
		if($secret)array_push($header,"share-secret:".$secret);
		$result=$this->postCurl($url,'',$header,'GET');
		$filename = md5(time().mt_rand(10, 99))."th.png"; //新图片名称
		$this->makeDir("./resource/down/");
		$file = fopen("./resource/down/".$filename,"w") or die("Unable to open file!");//打开文件准备写入
		fwrite($file,$result);//写入
		fclose($file);//关闭
		return $filename;
	}
	//--------------------------------------------------------发送消息
	/*
		发送文本消息
	*/
	function sendText($from,$target,$content,$ext="",$target_type="users"){
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="txt";
		$options['msg']=$content;
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	/*
		发图片消息
	*/
	function sendImage($from,$target,$filepath,$filename="",$ext="",$target_type="users"){
		$image_info = $this->image_info($filepath);
		$result=$this->uploadFile($filepath);
		$this->log('easeLog.txt', 'Image: '.json_encode($result));
		$uri=$result['uri'].'/'.$result['entities'][0]['uuid'];
		$secret=isset($result['entities'][0]['share-secret'])?$result['entities'][0]['share-secret']:'';
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="img";
		$options['url']=$uri;
		$options['filename']=$filename?$filename:md5(time().mt_rand(10, 99)).".png";
		$options['secret']=$secret;
		$options['size']=array(
			"width"=>$image_info["width"],
			"height"=>$image_info["height"]
		);
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		//$b=json_encode($body,true);
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	/*
		发语音消息
	*/
	function sendAudio($from,$target,$filepath,$filename="",$ext="",$target_type="users"){
		$audio_info = $this->audio_info($filepath);
		$length = $audio_info['playtime_seconds'];
		$result=$this->uploadFile($filepath);
		$this->log('easeLog.txt', 'Audio: '.json_encode($result));
		$uri=$result['uri'].'/'.$result['entities'][0]['uuid'];
		$secret=isset($result['entities'][0]['share-secret'])?$result['entities'][0]['share-secret']:'';
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="audio";
		$options['url']=$uri;
		$options['filename']=$filename?$filename:md5(time().mt_rand(10, 99)).".amr";
		$options['length']=$length;//时长
		$options['secret']=$secret;
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		//$b=json_encode($body,true);
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	/*
		发视频消息
	*/
	function sendVideo($from,$target,$filepath,$thumbpath="",$filename="",$ext="",$target_type="users"){
		$result=$this->uploadFile($filepath);
		$this->log('easeLog.txt', 'Video: '.json_encode($result));
		$uri=$result['uri'].'/'.$result['entities'][0]['uuid'];
		$secret=isset($result['entities'][0]['share-secret'])?$result['entities'][0]['share-secret']:'';
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="video";
		$options['url']=$uri;
		$options['filename']=$filename?$filename:md5(time().mt_rand(10, 99)).".mp4";
		if($thumbpath){
			$result=$this->uploadFile($thumbpath);
			$this->log('easeLog.txt', 'Video thumb: '.json_encode($result));
			$options['thumb']=$result['uri'].'/'.$result['entities'][0]['uuid'];
			$options['thumb_secret']=isset($result['entities'][0]['share-secret'])?$result['entities'][0]['share-secret']:'';
		}
		$options['file_length']=filesize($filepath);
		//$options['length']=$length;//时长
		$options['secret']=$secret;
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		//$b=json_encode($body,true);
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	/*
		发文件消息
	*/
	function sendFile($from,$target,$filepath,$filename="",$ext="",$target_type="users"){
		$extension = pathinfo($filepath, PATHINFO_EXTENSION);
		$result=$this->uploadFile($filepath);
		//$this->log('easeLog.txt', 'File: '.json_encode($result));
		$uri=$result['uri'].'/'.$result['entities'][0]['uuid'];
		$secret=isset($result['entities'][0]['share-secret'])?$result['entities'][0]['share-secret']:'';
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="file";
		$options['url']=$uri;
		$options['filename']=$filename?$filename:md5(time().mt_rand(10, 99)).($extension?'.'.$extension:'');
		$options['secret']=$secret;
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		//$b=json_encode($body,true);
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	/*
		发送透传消息
	*/
	function sendCmd($from,$target,$action,$ext="",$target_type="users"){
		$url=$this->url.'messages';
		$body['target_type']=$target_type;
		$body['target']=is_array($target)?$target:array($target);
		$options['type']="cmd";
		$options['action']=$action;
		$body['msg']=$options;
		$body['from']=$from;
		$body['ext']=$ext;
		$b=json_encode($body);
		$header=array($this->getToken());
		//$b=json_encode($body,true);
		$result=$this->postCurl($url,$b,$header);
		return $result;
	}
	//-------------------------------------------------------------群组操作
	/*
		获取app中的所有群组
	*/
	function getGroups($limit=0,$cursor=''){
		$limit=$limit?"&limit=".$limit:'';
		$cursor=!empty($cursor)?"&cursor=".$cursor:'';
		$url=$this->url."chatgroups?type=getgroups".$limit.$cursor;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,"GET");
		if(isset($result["cursor"])){
			$this->saveFile("group_cursor.txt",$result["cursor"]);
		}
		return $result;
	}
	/*
		获取一个或多个群组的详情
	*/
	function getGroupDetail($group_ids){
		$g_ids=implode(',',$group_ids);
		$url=$this->url.'chatgroups/'.$g_ids;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		创建一个群组
	*/
	function createGroup($options){
		$url=$this->url.'chatgroups';
		$header=array($this->getToken());
		$body=json_encode($options);
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		修改群组信息
	*/
	function modifyGroupInfo($group_id,$options){
		$url=$this->url.'chatgroups/'.$group_id;
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,'PUT');
		return $result;
	}
	/*
		删除群组
	*/
	function deleteGroup($group_id){
		$url=$this->url.'chatgroups/'.$group_id;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		获取群组中的成员
	*/
	function getGroupUsers($group_id){
		$url=$this->url.'chatgroups/'.$group_id.'/users';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		群组单个加人
	*/
	function addGroupMember($group_id,$username){
		$url=$this->url.'chatgroups/'.$group_id.'/users/'.$username;
		$header=array($this->getToken(),'Content-Type:application/json');
		$result=$this->postCurl($url,'',$header);
		return $result;
	}
	/*
		群组批量加人
	*/
	function addGroupMembers($group_id,$usernames){
		$url=$this->url.'chatgroups/'.$group_id.'/users';
		$body=json_encode($usernames);
		$header=array($this->getToken(),'Content-Type:application/json');
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		群组单个减人
	*/
	function deleteGroupMember($group_id,$username){
		$url=$this->url.'chatgroups/'.$group_id.'/users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		群组批量减人
	*/
	function deleteGroupMembers($group_id,$usernames){
		$url=$this->url.'chatgroups/'.$group_id.'/users/'.$usernames;
		//$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		获取一个用户参与的所有群组
	*/
	function getGroupsForUser($username){
		$url=$this->url.'users/'.$username.'/joined_chatgroups';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		群组转让
	*/
	function changeGroupOwner($group_id,$options){
		$url=$this->url.'chatgroups/'.$group_id;
		$body=json_encode($options);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,'PUT');
		return $result;
	}
	/*
		查询一个群组黑名单用户名列表
	*/
	function getGroupBlackList($group_id){
		$url=$this->url.'chatgroups/'.$group_id.'/blocks/users';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		群组黑名单单个加人
	*/
	function addGroupBlackMember($group_id,$username){
		$url=$this->url.'chatgroups/'.$group_id.'/blocks/users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header);
		return $result;
	}
	/*
		群组黑名单批量加人
	*/
	function addGroupBlackMembers($group_id,$usernames){
		$url=$this->url.'chatgroups/'.$group_id.'/blocks/users';
		$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		群组黑名单单个减人
	*/
	function deleteGroupBlackMember($group_id,$username){
		$url=$this->url.'chatgroups/'.$group_id.'/blocks/users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		群组黑名单批量减人
	*/
	function deleteGroupBlackMembers($group_id,$usernames){
		$url=$this->url.'chatgroups/'.$group_id.'/blocks/users';
		$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header,'DELETE');
		return $result;
	}
	//-------------------------------------------------------------聊天室操作
	/*
		创建聊天室
	*/
	function createChatRoom($options){
		$url=$this->url.'chatrooms';
		$header=array($this->getToken());
		$body=json_encode($options);
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		修改聊天室信息
	*/
	function modifyChatRoom($chatroom_id,$options){
		$url=$this->url.'chatrooms/'.$chatroom_id;
		$body=json_encode($options);
		$result=$this->postCurl($url,$body,$header,'PUT');
		return $result;
	}
	/*
		删除聊天室
	*/
	function deleteChatRoom($chatroom_id){
		$url=$this->url.'chatrooms/'.$chatroom_id;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		获取app中所有的聊天室
	*/
	function getChatRooms(){
		$url=$this->url.'chatrooms';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,"GET");
		return $result;
	}
	/*
		获取一个聊天室的详情
	*/
	function getChatRoomDetail($chatroom_id){
		$url=$this->url.'chatrooms/'.$chatroom_id;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		获取一个用户加入的所有聊天室
	*/
	function getChatRoomJoined($username){
		$url=$this->url.'users/'.$username.'/joined_chatrooms';
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'GET');
		return $result;
	}
	/*
		聊天室单个成员添加
	*/
	function addChatRoomMember($chatroom_id,$username){
		$url=$this->url.'chatrooms/'.$chatroom_id.'/users/'.$username;
		//$header=array($this->getToken());
		$header=array($this->getToken(),'Content-Type:application/json');
		$result=$this->postCurl($url,'',$header);
		return $result;
	}
	/*
		聊天室批量成员添加
	*/
	function addChatRoomMembers($chatroom_id,$usernames){
		$url=$this->url.'chatrooms/'.$chatroom_id.'/users';
		$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,$body,$header);
		return $result;
	}
	/*
		聊天室单个成员删除
	*/
	function deleteChatRoomMember($chatroom_id,$username){
		$url=$this->url.'chatrooms/'.$chatroom_id.'/users/'.$username;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	/*
		聊天室批量成员删除
	*/
	function deleteChatRoomMembers($chatroom_id,$usernames){
		$url=$this->url.'chatrooms/'.$chatroom_id.'/users/'.$usernames;
		//$body=json_encode($usernames);
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,'DELETE');
		return $result;
	}
	//-------------------------------------------------------------聊天记录
	/*
		导出聊天记录
	*/
	function chatRecord($ql='',$limit=20,$cursor='') {
		$ql=!empty($ql)?"ql=".$ql:"order+by+timestamp+desc";
		$limit=$limit?"&limit=".$limit:'';
		$cursor=!empty($cursor)?"&cursor=".$cursor:'';
		$url=$this->url."chatmessages?".$ql.$limit.$cursor;
		$header=array($this->getToken());
		$result=$this->postCurl($url,'',$header,"GET");
		if(isset($result["cursor"])){
			$this->saveFile("chat_cursor.txt",$result["cursor"]);
		}
		return $result;
	}
	//-------------------------------------------------------------文件操作
	/*
		图片信息
	*/
	function image_info($file){
		$img_info = getimagesize($file);
		$img_type = 'UNKOWN';
		switch ($img_info[2]) {
			case 1:$img_type = "GIF";break;
			case 2:$img_type = "JPG";break;
			case 3:$img_type = "PNG";break;
		}
		$img_size = ceil(filesize($file)/1000)."k";
		$ret = array(
			"width"=>$img_info[0],
			"height"=>$img_info[1],
			"type"=>$img_type,
			"size"=>$img_size
		);
		return $ret;
	}
	/*
		音频信息
	*/
	function audio_info($file){
		require_once("getid3/getid3.php");
		$getID3 = new getID3();
		$ret = $getID3->analyze($file);
		return $ret;
	}
	/*
		视频信息，当中用到passthru，可能部分虚拟主机会将此命令禁用
	*/
	function video_info($file){
		ob_start();
		passthru(sprintf(KC_FFMPEG_PATH, $file));
		$info = ob_get_contents();
		ob_end_clean();
		// 通过使用输出缓冲，获取到ffmpeg所有输出的内容。
		$ret = array();
		// Duration: 01:24:12.73, start: 0.000000, bitrate: 456 kb/s
		if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) {
			$ret['duration'] = $match[1]; // 提取出播放时间
			$da = explode(':', $match[1]); 
			$ret['seconds'] = $da[0] * 3600 + $da[1] * 60 + $da[2]; // 转换为秒
			$ret['start'] = $match[2]; // 开始时间
			$ret['bitrate'] = $match[3]; // bitrate 码率 单位 kb
		}
		// Stream #0.1: Video: rv40, yuv420p, 512x384, 355 kb/s, 12.05 fps, 12 tbr, 1k tbn, 12 tbc
		if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) {
			$ret['vcodec'] = $match[1]; // 编码格式
			$ret['vformat'] = $match[2]; // 视频格式 
			$ret['resolution'] = $match[3]; // 分辨率
			$a = explode('x', $match[3]);
			$ret['width'] = $a[0];
			$ret['height'] = $a[1];
		}
		// Stream #0.0: Audio: cook, 44100 Hz, stereo, s16, 96 kb/s
		if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) {
			$ret['acodec'] = $match[1];       // 音频编码
			$ret['asamplerate'] = $match[2];  // 音频采样频率
		}
		if (isset($ret['seconds']) && isset($ret['start'])) {
			$ret['play_time'] = $ret['seconds'] + $ret['start']; // 实际播放时间
		}
		$ret['size'] = filesize($file); // 文件大小
		$thumb_name = md5(time().mt_rand(10, 99)).'.jpg';//缩略图
		$time = 1;//默认截取第一秒第一帧 
		exec("ffmpeg -i ".$file." -y -f mjpeg -ss ".$time." -t 0.001 -s 320x240 ".$thumb_name."",$out,$status);
		if($status==0)$ret['thumb_name'] = $thumb_name;
		return $ret;
	}
	/*
		创建文件夹, 支持创建多级目录
	*/
	function makeDir($name, $mode=0777){
		if (is_dir($name)) return true;
		$name = str_replace('\\', '/', $name);
		$root_path = '';
		if (substr($name, 0, 1)=='/') {
			$root_path = $_SERVER['DOCUMENT_ROOT'];
			if (defined('ROOT_PATH')) $root_path = ROOT_PATH;
		} else if (substr($name, 0, 2)=='./') {
			$root_path = dirname(__FILE__);
		} else if (substr($name, 0, 3)=='../') {
			$root_path = __FILE__;
			$names = explode('/', $name);
			foreach ($names as $n) {
				if ($n!='..') break;
				$root_path = dirname($root_path);
			}
		}
		$root = str_replace('\\', '/', $root_path);
		$relative = str_replace($root, '', $name);
		$each = explode('/', $relative);
		$path = $root;
		foreach ($each as $p) {
			if ($p) {
				$path .= '/'.$p;
				if (!is_dir($path)) {
					if (mkdir($path, $mode)) {
						chmod($path, $mode);
						fclose(fopen($path . '/index.htm', 'w'));
					} else {
						return false;
					}
				} else {
					chmod($path, $mode);
				}
			}
		}
		return true;
	}
	/*
		读取文件
	*/
	function getFile($filename, $usepath=true){
		$file = ($usepath?$this->filepath:'').$filename;
		$data = file_get_contents($file);
		return $data;
	}
	/*
		保存文件
	*/
	function saveFile($filename, $content=''){
		$file = $this->filepath.$filename;
		$path = str_replace('\\', '/', $file);
		$paths = explode('/', $path);
		$path = str_replace('/'.$paths[count($paths)-1], '', $path);
		$this->makeDir($path);
		$handle = fopen($file, 'w') or die("UNABLE TO OPEN FILE");
		fwrite($handle, $content);
		fclose($handle);
		chmod($file, 0777);
	}
	/*
		记录LOG
	*/
	public function log($filename, $content){
		$file = $this->filepath.$filename;
		file_put_contents($file, date('Y-m-d H:i:s')."\n".$content."\n==============================\n\n", FILE_APPEND);
	}
	/*
		CURL Post
	*/
	function postCurl($url,$body,$header,$type="POST"){
		//创建一个curl资源
		$ch = curl_init();
		//设置URL和相应的选项
		curl_setopt($ch, CURLOPT_URL, $url);//设置url
		//设置请求头
		//array_push($header, 'Accept:application/json');
		//array_push($header,'Content-Type:application/json');
		//array_push($header, 'http:multipart/form-data');
		//设置为false,只会获得响应的正文(true的话会连响应头一并获取到)
		//curl_setopt($ch, CURLOPT_HEADER, TRUE);
		curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
		curl_setopt($ch, CURLOPT_TIMEOUT, 60); //设置超时限制防止死循环
		//设置发起连接前的等待时间，如果设置为0，则无限等待。
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
		//将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		//设备请求体
		if (count($body)>0) {
			//$b=json_encode($body,true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $body);//全部数据使用HTTP协议中的"POST"操作来发送。
		}
		//设置请求头
		if(count($header)>0){
			curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
		}
		//上传文件相关设置
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
		curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//对认证证书来源的检查
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//从证书中检查SSL加密算
		//设置提交方式
		switch($type){
			case "GET":
				curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
				break;
			case "POST":
				curl_setopt($ch, CURLOPT_POST, TRUE);
				break;
			case "PUT"://使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTT
				curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
				break;
			case "DELETE":
				curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
				break;
		}
		//在HTTP请求中包含一个"User-Agent: "头的字符串。-----必设
		//curl_setopt($ch, CURLOPT_USERAGENT, 'SSTS Browser/1.0');
		//curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'); //模拟用户使用的浏览器
		//抓取URL并把它传递给浏览器
		$res=curl_exec($ch);
		//exit(json_encode( curl_getinfo($ch) ));
		$result=json_decode($res, TRUE);
		//关闭curl资源，并且释放系统资源
		curl_close($ch);
		if(empty($result))return $res;
		else return $result;
	}
}
